#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
使用虚拟环境打包备份调度器为单文件可执行程序
只包含必要的依赖包，减小文件大小
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def build_exe():
    """
    使用虚拟环境中的PyInstaller打包main.py为单文件exe
    """
    print("🔧 开始使用虚拟环境打包...")
    
    # 获取当前目录
    current_dir = Path.cwd()
    venv_python = current_dir / "venv" / "Scripts" / "python.exe"
    venv_pyinstaller = current_dir / "venv" / "Scripts" / "pyinstaller.exe"
    
    # 检查虚拟环境是否存在
    if not venv_python.exists():
        print("❌ 虚拟环境不存在，请先创建虚拟环境")
        return False
    
    if not venv_pyinstaller.exists():
        print("❌ PyInstaller未安装在虚拟环境中")
        return False
    
    # 清理之前的构建文件
    build_dir = current_dir / "build"
    dist_dir = current_dir / "dist"
    
    if build_dir.exists():
        shutil.rmtree(build_dir)
        print("🧹 清理旧的build目录")
    
    if dist_dir.exists():
        shutil.rmtree(dist_dir)
        print("🧹 清理旧的dist目录")
    
    # PyInstaller命令参数
    cmd = [
        str(venv_pyinstaller),
        "--onefile",                    # 打包为单文件
        "--name=BackupScheduler",       # 可执行文件名
        "--add-data=tasklist;tasklist", # 包含tasklist目录
        "--console",                    # 控制台应用
        "--clean",                      # 清理临时文件
        "--noconfirm",                  # 不询问覆盖
        "--distpath=dist",              # 输出目录
        "--workpath=build",             # 工作目录
        "main.py"                       # 主程序文件
    ]
    
    try:
        print(f"📦 执行打包命令: {' '.join(cmd)}")
        result = subprocess.run(cmd, check=True, capture_output=True, text=True, encoding='utf-8')
        
        print("✅ 打包成功！")
        
        # 检查生成的文件
        exe_path = dist_dir / "BackupScheduler.exe"
        if exe_path.exists():
            file_size = exe_path.stat().st_size / (1024 * 1024)  # MB
            print(f"📁 可执行文件路径: {exe_path}")
            print(f"📊 文件大小: {file_size:.2f} MB")
            print(f"📁 包含任务列表目录: {dist_dir / 'tasklist'}")
            
            # 显示使用说明
            print("\n🎯 使用说明:")
            print("1. 将整个dist目录复制到目标机器")
            print("2. 运行BackupScheduler.exe")
            print("3. 程序会自动读取tasklist目录中的任务文件")
            print("4. 支持通配符、日期占位符和进度条显示")
            
            return True
        else:
            print("❌ 未找到生成的可执行文件")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"❌ 打包失败: {e}")
        print(f"错误输出: {e.stderr}")
        return False
    except Exception as e:
        print(f"❌ 打包过程中出现错误: {e}")
        return False

def main():
    """
    主函数
    """
    print("=" * 60)
    print("🚀 备份调度器虚拟环境打包工具")
    print("=" * 60)
    
    success = build_exe()
    
    if success:
        print("\n🎉 打包完成！可执行文件已生成在dist目录中。")
    else:
        print("\n💥 打包失败，请检查错误信息。")
        sys.exit(1)

if __name__ == "__main__":
    main()